CS371: Cognitive Science \n",
"Bryn Mawr College, Fall 2016 \n",
"Prof. Blank\n",
"
\n",
"\n",
"This is a team-based project."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"*Please put your \"# title\" and \"## by-line\" in the next two cells (respectively), and then delete this cell*"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": false,
"nbgrader": {
"checksum": "11602f52fe25f5e421531fe993d637c1",
"grade": true,
"grade_id": "title",
"locked": false,
"points": 10,
"solution": true
}
},
"source": [
"YOUR ANSWER HERE"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": false,
"nbgrader": {
"checksum": "c3a78a17e38006b5095ace46d88155f1",
"grade": true,
"grade_id": "by-line",
"locked": false,
"points": 10,
"solution": true
}
},
"source": [
"YOUR ANSWER HERE"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This lab explores using evolution to find a good Ladybug DNA. First, we have all of our imports and setup that we will need:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from calysto.simulation import DiscreteView, get_robot, DNARobot\n",
"from calysto.display import display, clear_output\n",
"import random\n",
"import string\n",
"import copy\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For these experiments, we will be using the DNA representation that is:\n",
"\n",
"* exactly 93 characters long\n",
"* made up of the characters \"0123456789\"\n",
"\n",
"Remember that exactly what these 93 bits of DNA are is unknown to us, as is the meaning of each character. We don't know how these DNA encode a Ladybug brain, but we know that somehow they do.\n",
"\n",
"Our mission is to search through the space of possible Ladybug brains and find a good one, if not the best."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Genetic Algorithm\n",
"\n",
"Evolutionary algorithms are techniques for searching through a solution landscape in a generally effective manner. \n",
"\n",
"All evolutionary strategies have a core set of properties:\n",
"\n",
"* A \"population\" of solutions\n",
"* Limited resources (not all solutions will survive)\n",
"* A measure of performance, called ''fitness''\n",
"* Preferential treatment toward the higher measured solutions (the most fit ones)\n",
"* Reliance on randomness\n",
"\n",
"A typical evolutionary system follows this basic algorithm:\n",
"\n",
"1. Create a random population of solutions\n",
"2. Compute a fitness measure for each\n",
"3. Create new members by mutating and/or combining old ones (often selecting the better ones based on fitness)\n",
"4. Select the most fit for the next generation\n",
"5. Go to Step #3\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Randomized DNA Function"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, we make a simple function to make a random DNA string:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"alphabet = \"0123456789\"\n",
"\n",
"def make_dna(length):\n",
" return \"\".join([random.choice(alphabet) for i in range(length)])"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"'667725087231604835114936588685531632573346010361182621852439651692351185085263856981249486522'"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dna = make_dna(93)\n",
"dna"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1.2 Fitness Function"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's let the ladybug move about for a few simulated seconds, or until it dies (whichever happens first). We'll take the fitness to be the average amount of energy that it has over that time.\n",
"\n",
"To make this a bit easier on our ladybug, we'll add an extra cluster of food around it when we test the ladybug.\n",
"\n",
"First, we make a simulation object and get the simulated ladybug:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"sim = DiscreteView(\"Ladybug1\")\n",
"robot = get_robot()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Nothing is visible, but it exists. This is to make the simulation run fast. Whenever we want, we can see where the ladybug is:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nJlx26HeHfnH6F/cvvP/oXxz94f/9YcyJPdT0UNPtTV/7OWf2AQCSCpdlYs/wSe4AAAIUSURBVObz\n9sNnJybW/vrlv/74/I8/2vLo9rbtulZN+5u9fzPpHaZ18QSf+9+f+9kXfvaJOz7xp/f+ae6RE78/\ncfMJio3/a2PPlp777rzvz9r+LPfIsfPH9ry9ZyovAQAIv/KWZSRlspkNz264f+H9nQ2dnry+ob7X\nT79+ffrTwZ+m3fT1/0RnvniCCc997/J77d9tf3DRg6sWrkq76b2/3Xv7jNsfaHwgd8H1K89eOtvx\n3Y41i9asaFgxenX0rXfe2ndynyd+aQYAYEqchlsavnjli5POvjvju8Ofnfg3QgAAguRtNfyzaaeb\nXlkGAICAKVSWiXpdXupoqinblFBi7CwZT45uGtX8Cq4VAICyi8ibbdrpHD0tZ8CJ/ihqKsu40qA0\nIkmql1qk+JjXYMqUKVOmTGt7atjpCpdlnCNOdFe0XvWL3EWSTsZPjmjk+jbJlClTpkyZ1v7UsNM5\nzmanrnv8eftrf2FMd6UlMWXKlClTpiGeOvEZ8e2Xt9980nBYwztm7JCn7VeYMmXKlCnT0E5NZZmZ\n2Zl1Xh1TpkyZMmUa1mmBssxtmdvu9PL+GgemTJkyZco06NNGtzGSbwYAgA0ip2On880uxi4yZcqU\nKVOmIZ6eip8ylWUuRC6ciTJlypQpU6ahnRYuy2SXZpkyZcqUKdMQT2+UZeZoTrPbLOlE/MQ5nbtx\nRJEpU6ZMmTIN7/T/AwfMGMsOI0UCAAAAAElFTkSuQmCC\n",
"image/svg+xml": [
""
],
"text/plain": [
"